package com.da.common.utils;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Base64;

/**
 * @Author: hyacinth
 * @CreateTime: 2025-01-16
 * @Version: 1.0
 * <p>
 * PBKDF2 密码哈希工具类
 * 提供密码加密和验证功能
 */

public class PBKDF2Util {

    // 算法名称
    private static final String ALGORITHM = "PBKDF2WithHmacSHA256";
    // 迭代次数
    private static final int ITERATIONS = 10000;
    // 密钥长度（单位：位）
    private static final int KEY_LENGTH = 256;

    /**
     * 生成随机盐值
     *
     * @return 盐值（Base64 编码）
     */
    public static String generateSalt() {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[16];
        random.nextBytes(salt);
        return Base64.getEncoder().encodeToString(salt);
    }

    /**
     * 加密密码
     *
     * @param password 明文密码
     * @param salt     盐值（Base64 编码）
     * @return 哈希后的密码（Base64 编码）
     */
    public static String hashPassword(String password, String salt) {
        try {
            PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), Base64.getDecoder().decode(salt), ITERATIONS, KEY_LENGTH);
            SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
            byte[] hash = factory.generateSecret(spec).getEncoded();
            return Base64.getEncoder().encodeToString(hash);
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            throw new RuntimeException("PBKDF2 加密失败", e);
        }
    }

    /**
     * 验证密码
     *
     * @param inputPassword 用户输入的密码
     * @param storedHash    数据库中存储的哈希值（Base64 编码）
     * @param salt          数据库中存储的盐值（Base64 编码）
     * @return 是否验证成功
     */
    public static boolean verifyPassword(String inputPassword, String storedHash, String salt) {
        String inputHash = hashPassword(inputPassword, salt);
        return inputHash.equals(storedHash);
    }


}
